JavaScript 56.7%
TypeScript 42.6%
1import { NextRequest, NextResponse } from "next/server";2import { prisma } from "@/lib/prisma";3import { saveFile, saveVersion } from "@/lib/storage";4import { logActivity } from "@/lib/activity";5import { MAX_VERSIONS_PER_FILE } from "@/lib/config";67export async function POST(8 request: NextRequest,9 { params }: { params: { id: string } }10) {11 const file = await prisma.file.findUnique({ where: { id: params.id } });1213 if (!file) {14 return NextResponse.json({ error: "File not found" }, { status: 404 });15 }1617 const formData = await request.formData();18 const blob = formData.get("file") as File;19 const asNewVersion = formData.get("asNewVersion") === "true";2021 if (!blob) {22 return NextResponse.json({ error: "No file provided" }, { status: 400 });23 }2425 const buffer = Buffer.from(await blob.arrayBuffer());2627 if (asNewVersion) {28 // Save current as version29 const versionCount = await prisma.fileVersion.count({ where: { fileId: file.id } });30 const versionResult = await saveVersion(file.storagePath, file.name);3132 await prisma.fileVersion.create({33 data: {34 fileId: file.id,35 versionNum: versionCount + 1,36 storagePath: versionResult.storagePath,37 size: BigInt(versionResult.size),38 changeNote: "Before edit",39 },40 });4142 // Cleanup old versions43 const versions = await prisma.fileVersion.findMany({44 where: { fileId: file.id },45 orderBy: { versionNum: "asc" },46 });47 if (versions.length > MAX_VERSIONS_PER_FILE) {48 const toDelete = versions.slice(0, versions.length - MAX_VERSIONS_PER_FILE);49 for (const v of toDelete) {50 const { deleteVersion } = await import("@/lib/storage");51 await deleteVersion(v.storagePath);52 await prisma.fileVersion.delete({ where: { id: v.id } });53 }54 }55 }5657 // Save edited file58 const result = await saveFile(buffer, file.name);5960 // Delete old file and update record61 const { deleteFile } = await import("@/lib/storage");62 await deleteFile(file.storagePath);6364 const updated = await prisma.file.update({65 where: { id: params.id },66 data: {67 storagePath: result.storagePath,68 size: BigInt(result.size),69 isEncrypted: true,70 },71 });7273 await logActivity("EDIT", file.id, `Edited ${file.name}`);7475 return NextResponse.json({76 ...updated,77 size: Number(updated.size),78 });79}80